#!/bin/bash

# SPDX-License-Identifier: GPL-2.0-or-later
# Copyright (C) 2009-2016 Stephan Raue (stephan@openelec.tv)
# Copyright (C) 2018-present Team CoreELEC (https://coreelec.org)

. config/options ""

get_deps() {
  need=()
  need_pkg=()

  for i in "${!deps[@]}"; do
    dep=${deps[$i]}
    dep_pkg=${deps_pkg[$i]}
    if ! command -v "$dep" >/dev/null; then
      need+=($dep)
      need_pkg+=("$dep_pkg")
    fi
  done

  for i in "${!files[@]}"; do
    file=${files[$i]}
    file_pkg=${files_pkg[$i]}
    if [ ! -f "$file" ]; then
      need+=($file)
      need_pkg+=("$file_pkg")
    fi
  done

  for i in "${!perl_mod[@]}"; do
    mod=${perl_mod[$i]}
    pkg=${perl_pkg[$i]}

    if ! perl -M"$mod" -e exit 2>/dev/null; then
      need+=(perl::$mod)
      need_pkg+=($pkg)
    fi
  done
}

get_yes_no()
{
  local ans
  read -p "Would you like to install the needed tools? (y/n) " ans
  [ "${ans,,}" = "y" ] && return 0
  [ "${ans,,}" = "yes" ] && return 0
  return 1
}

if  [ -f /etc/lsb-release ]; then
  DISTRO=$(grep DISTRIB_ID /etc/lsb-release | cut -d "=" -f 2)
fi

if  [ -f /etc/os-release ]; then
  DISTRO=$(grep ^ID= /etc/os-release | cut -d "=" -f 2)
fi

DISTRO=${DISTRO,,}

deps=(wget bash bc gcc sed patch lsdiff tar bzip2 gzip perl gawk gperf zip unzip diff lzop)
deps_pkg=(wget bash bc gcc sed patch patchutils tar bzip2 gzip perl gawk gperf zip unzip diffutils lzop)

files=(/usr/include/stdio.h /usr/include/ncurses.h)
files_pkg=(libc6-dev libncurses5-dev)

perl_mod=(JSON XML::Parser)

case "$DISTRO" in
    fedora|centos|rhel)
      deps+=(g++ mkfontscale mkfontdir bdftopcf xsltproc java python parallel pigz)
      deps_pkg+=(gcc-c++ xorg-x11-font-utils xorg-x11-font-utils xorg-x11-font-utils libxslt java-1.7.0-openjdk python2 parallel pigz)
      if [[ ! $(rpm -qa glibc-static) ]]; then
        deps+=(glibc-static)
        deps_pkg+=(glibc-static)
      fi
      if [[ ! $(rpm -qa libstdc++-static) ]]; then
        deps+=(libstdc++-static)
        deps_pkg+=(libstdc++-static)
      fi
      files_pkg=(glibc-headers ncurses-devel)
      perl_pkg=(perl-JSON perl-XML-parser)
      ;;
    gentoo|sabayon)
      deps+=(g++ mkfontscale mkfontdir bdftopcf xsltproc java python parallel pigz)
      deps_pkg+=("gcc[cxx]" mkfontscale mkfontdir bdftopcf libxslt virtual/jre python sys-process/parallel pigz)
      files_pkg=(glibc ncurses)
      perl_pkg=(JSON XML-Parser)
      ;;
    arch|manjaro)
      deps+=(g++ mkfontscale mkfontdir bdftopcf xsltproc java python rpcgen parallel pigz)
      deps_pkg+=(g++ xorg-mkfontscale xorg-mkfontdir xorg-bdftopcf libxslt "java-runtime-common jdk8-openjdk" python2 rpcsvc-proto parallel pigz)
      perl_pkg=(perl-json perl-xml-parser)
      ;;
    opensuse)
      deps+=( g++ mkfontscale mkfontdir bdftopcf xsltproc java python parallel pigz)
      deps_pkg+=(gcc-c++ mkfontscale mkfontdir bdftopcf libxslt-tools java-1_8_0-openjdk python gnu_parallel pigz)
      if [[ ! $(rpm -qa glibc-devel-static) ]]; then
        deps+=(glibc-devel-static)
        deps_pkg+=(glibc-devel-static)
      fi
      perl_pkg=(perl-JSON perl-XML-Parser)
      ;;
    *)
      deps+=(g++ mkfontscale mkfontdir bdftopcf xsltproc java python parallel pigz)
      deps_pkg+=(g++ xfonts-utils xfonts-utils xfonts-utils xsltproc default-jre python parallel pigz)
      perl_pkg=(libjson-perl libxml-parser-perl)
      ;;
esac

# project specific dependencies
if [ -n "$EXTRA_DEPS" ] ; then
  deps+=($EXTRA_DEPS)
fi
if [ -n "$EXTRA_DEPS_PKG" ] ; then
  deps_pkg+=($EXTRA_DEPS_PKG)
fi

# distro specific dependencies
if [ -n "$DISTRO_DEPS" ] ; then
  deps+=($DISTRO_DEPS)
fi
if [ -n "$DISTRO_DEPS_PKG" ] ; then
  deps_pkg+=($DISTRO_DEPS_PKG)
fi

get_deps

if [ "${#need[@]}" -gt 0 ]; then
  echo "**** Your system lacks the following tools needed to build $DISTRONAME ****"
  for i in "${!need[@]}"; do
    echo "${need[$i]} provided by ${need_pkg[$i]}"
  done
  echo "**** You seem to use a $DISTRO system ****"

  if command -v sudo >/dev/null; then
    case "$DISTRO" in
      ubuntu|debian|linuxmint|\"elementary\")
        get_yes_no && sudo apt-get install "${need_pkg[@]}"
        ;;
      fedora|centos|rhel)
        command -v dnf >/dev/null && YUM=dnf || YUM=yum
        get_yes_no && sudo $YUM install "${need_pkg[@]}"
        ;;
      gentoo)
        get_yes_no && sudo emerge --ask --deep "${need_pkg[@]}"
        ;;
      sabayon)
        get_yes_no && sudo equo install --ask "${need_pkg[@]}"
        ;;
      mageia)
        get_yes_no && sudo urpmi "${need_pkg[@]}"
        ;;
      arch|manjaro)
        get_yes_no && sudo pacman -Sy "${need_pkg[@]}"
        ;;
      opensuse)
        get_yes_no && sudo zypper install -y --no-recommends "${need_pkg[@]}"
        ;;
      *)
        echo "**** unsupported distro $DISTRO ****"
        exit 1
        ;;
    esac
  else
    echo "The command 'sudo' was not found. Please install necessary packages manually."
  fi
fi

get_deps

if [ "${#need[@]}" -gt 0 ]; then
  echo "**** The following packages were not installed correctly ****"
  for i in "${!need[@]}"; do
    echo "${need[$i]} provided by ${need_pkg[$i]}"
  done
  echo "********"
  exit 1
fi
